package cn.slg.module.system.service.pk.utils;

import cn.slg.module.system.dal.dataobject.wujiang.WuJiangDO;
import cn.slg.module.system.service.pk.skill.SKillCount;

import java.util.Map;
import java.util.function.Supplier;

public class Harm {
    // 1.计算基础伤害
    private static Float baseHarm(WuJiangDO attacker, WuJiangDO target, Supplier<Float> getAttackerPv, Supplier<Float> getTargetPv) {
        // 1.基础伤害，= 属性伤害 + 兵力伤害 (PS:最低为0)
        Float baseHarm;

        // 1.1属性伤害,最起码为0，不能是负值，如果是兵刃伤害，就是自己的物理和敌人的统帅对比，如果是谋略伤害，就是双方的智力对比。
        float propertyHarm = Math.max(getAttackerPv.get() * ((Math.max(attacker.getLevel() - 20, 0)) / 50 + 1) -
                getTargetPv.get() * ((Math.max(target.getLevel() - 20, 0)) / 50 + 1), 0);

        // 1.2兵力伤害
        float bingLiHarm = attacker.getBingLi() <= 2000 ? attacker.getBingLi() / 10 : (float) ((Math.log(attacker.getBingLi()) / Math.log(2) - 9) * 100);

        baseHarm = propertyHarm + bingLiHarm;
        return baseHarm;
    }

    // 2.基础增减伤 TODO
    private static Float idHarm(WuJiangDO self, WuJiangDO target) {
        Float idHarm = 1.0f;
        return idHarm;
    }

    // 3.保底伤害
    private static Float minimumHarm(WuJiangDO self) {
        Float minimumHarm = (float) (self.getBingLi() <= 5000 ? self.getBingLi() / 50 : 100);
        return minimumHarm;
    }

    // 5.兵种克制
    private static Float keZhi(WuJiangDO self, WuJiangDO target) {
        // 弓克枪，枪克骑，骑克盾，盾克弓；以上四个兵种克器械。克制时，伤害增加12%。反之，则减少12%。
        // TODO 这里先默认 1.0
        Float keZhi = 1.0f;
        return keZhi;
    }

    // 计算总伤害

    /**
     * @param isPhysical  是兵刃伤害不（）
     * @param attacker    攻击者
     * @param target      被攻击者
     * @param getSelfPv   攻击者参与伤害计算的属性（兵刃伤害就是物理，谋略伤害就是智力）
     * @param getTargetPv 被攻击者参与伤害计算的属性（兵刃伤害就是统帅，谋略伤害就是智力）
     * @param harmRate    伤害系数，普攻是100%。技能按照技能面板
     * @return
     */
    public static Short harm(boolean isPhysical, WuJiangDO attacker, WuJiangDO target, Supplier<Float> getSelfPv, Supplier<Float> getTargetPv, Float harmRate) {
        // 总伤害
        Short harm;

        // 1.基础伤害，= 属性伤害 + 兵力伤害 (PS:最低为0)
        Float baseHarm = baseHarm(attacker, target, getSelfPv, getTargetPv);

        // 2.基础增减伤 TODO
        Float idHarm = idHarm(attacker, target);

        // 3.保底伤害
        Float minimumHarm = minimumHarm(attacker);

        // 4.原始伤害
        Float originalHarm = baseHarm * idHarm + minimumHarm;

        // 5.兵种克制
        Float keZhi = keZhi(attacker, target);

        // 6.伤害系数 战法面板的百分比，普攻是100%。
        Float harmFactor = harmRate;

        // 7.计算该伤害
        Float totalHarm = originalHarm * attacker.getHarmRateByShiQi() * keZhi * harmFactor;

        // 8.基于是兵刃伤害还是谋略伤害。结合攻击者和目标的伤害倍率和受到伤害倍率，调节伤害值。
        if (isPhysical) {
            totalHarm = totalHarm * attacker.getPhysicalHarmRate() * target.getIsPhysicalHarmRate();
        } else {
            totalHarm = totalHarm * attacker.getMagicHarmRate() * target.getIsMagicHarmRate();
        }

        // 9.总伤害
        harm = totalHarm.shortValue();
        return harm;
    }


    // 统计该武将的技能伤害
    public static void skillHarmCount(WuJiangDO attacker, String skillName, Short harm) {

        // 累计 攻击者 战法杀伤(上面已经计算好此次攻击的伤害值了，无论目标死没死，这都要先统计)
        attacker.setTotalSkillHarm(attacker.getTotalSkillHarm() + harm);

        // 统计该技能的伤害
        SKillCount skillHarmCount = attacker.getSkillCount().get(skillName);
        skillHarmCount.setHarm(skillHarmCount.getHarm() + harm);

    }


}
